package uniquindio.facing.ingesis.moviles.undroiq.providers;

import java.util.ArrayList;
import java.util.List;

import uniquindio.facing.ingesis.moviles.undroiq.entidades.Usuario;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/***
 * Clase encargada de la conexion a la base de datos.
 * 
 * @author Richard Alexander Ortiz Salinas
 * 
 */
public class DatabaseHandler extends SQLiteOpenHelper {

	// Version de la base de datos
	private static final int DATABASE_VERSION = 1;

	// Nombre de la base de datos
	private static final String DATABASE_NAME = "usuariosManager";

	// Nombre de la tabla de usuarios
	private static final String TABLE_CONTACTS = "usuario";

	// Nombre de los indices de la tabla Usuario
	private static final String KEY_CEDULA = "cedula";
	private static final String KEY_EMAIL = "email";
	private static final String KEY_PASS = "password";

	/**
	 * Metodo Constructor
	 * 
	 * @param context
	 */
	public DatabaseHandler(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	/**
	 * Metodo encargado de crear las tablas de la BD.
	 * 
	 * @param db
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
				+ KEY_CEDULA + " TEXT PRIMARY KEY," + KEY_EMAIL + " TEXT,"
				+ KEY_PASS + " TEXT" + ")";
		db.execSQL(CREATE_CONTACTS_TABLE);
	}

	/**
	 * Metodo encargado de actulizar la tablas de la BD.
	 * 
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// Elimina si la tabla ya existe
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

		// Crea la tabla de nuevo
		onCreate(db);
	}

	/**
	 * Metodo encargado de agregar un usuario de la BD.
	 * 
	 * @param usuario
	 *            , objeto que se va a crear
	 */
	public void addContact(Usuario usuario) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_CEDULA, usuario.get_cedula()); // Nombre del usuario
		values.put(KEY_EMAIL, usuario.get_email()); // Email del usuario
		values.put(KEY_PASS, usuario.get_password()); // Password del usuario

		// Inserta las columnas
		db.insert(TABLE_CONTACTS, null, values);
		db.close(); // Cierra la conexion a la BD.
	}

	// Obtenci�n de un usuario de la BD
	Usuario getContact(int id) {
		SQLiteDatabase db = this.getReadableDatabase();

		Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_CEDULA,
				KEY_EMAIL, KEY_PASS }, KEY_CEDULA + "=?",
				new String[] { String.valueOf(id) }, null, null, null, null);
		if (cursor != null)
			cursor.moveToFirst();

		Usuario usuario = new Usuario(cursor.getString(0), cursor.getString(1),
				cursor.getString(2));
		// return el usuario
		return usuario;
	}

	/**
	 * Metodo encargado de obtener todos los usuarios de la BD.
	 * 
	 * @return List<Usuario>, lista con todos los usuarios.
	 */
	public List<Usuario> getAllContacts() {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		// Query para seleccionar todos los Usuarios
		String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;

		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor = db.rawQuery(selectQuery, null);

		// recorriendo todas las filas y agregando a la lista
		if (cursor.moveToFirst()) {
			do {
				Usuario contact = new Usuario();
				contact.set_cedula(cursor.getString(0));
				contact.set_email(cursor.getString(1));
				contact.set_password(cursor.getString(2));
				// Adding contact to list
				usuarios.add(contact);
			} while (cursor.moveToNext());
		}

		// retorna la lista de usuarios
		return usuarios;
	}

	/**
	 * Metodo encargado de actualizar un usuario de la BD
	 * 
	 * @param usuario
	 *            , objeto que se va a actualizar.
	 * @return
	 */
	public int updateContact(Usuario usuario) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_CEDULA, usuario.get_cedula());
		values.put(KEY_EMAIL, usuario.get_email());
		values.put(KEY_PASS, usuario.get_password());

		// Actualizando fila
		return db.update(TABLE_CONTACTS, values, KEY_CEDULA + " = ?",
				new String[] { String.valueOf(usuario.get_cedula()) });
	}

	/**
	 * Metodo para eliminar un usuario de la BD
	 * 
	 * @param usuario
	 *            , objeto que se va a eliminar.
	 */
	public void deleteContact(Usuario usuario) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(TABLE_CONTACTS, KEY_CEDULA + " = ?",
				new String[] { String.valueOf(usuario.get_cedula()) });
		db.close();
	}

	/**
	 * Metodo para obtener el numero de usuario de la BD
	 * 
	 * @return int, numero del usuario.
	 */
	public int getContactsCount() {
		String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		cursor.close();

		// retorna el nuemro de usuarios
		return cursor.getCount();
	}

}